#!/usr/bin/env node
import { program } from 'commander';
import chalk from 'chalk';
import fs from 'fs-extra';
import path from 'path';
import { startServer } from './server/server';
import { generateMarkdown } from './generator/markdownGenerator';
import { generateHtml } from './generator/htmlGenerator';
import { loadConfig, generateDefaultConfig } from './utils/config';
import { ParserMode, ParserFactory } from './parser/parserFactory';

// 版本信息
const packageJson = require('../package.json');
const version = packageJson.version;

// 默认配置
const DEFAULT_PORT = 3000;
const DEFAULT_SCAN_PATHS = ['src/components'];

/**
 * 解析命令行选项，优先级高于配置文件
 */
program
  .version(version, '-v, --version')
  .description('Vue组件文档生成工具 - 实时解析Vue组件并提供文档页面')
  .option('-c, --config <path>', '指定配置文件路径')
  .option('-p, --port <port>', '指定服务器端口', String(DEFAULT_PORT))
  .option('-s, --scan <paths>', '指定要扫描的组件路径，使用逗号分隔', DEFAULT_SCAN_PATHS.join(','))
  .option('-o, --output <path>', '输出文档的目录')
  .option('--vue-version <version>', '指定Vue版本 (2 或 3)')
  .option('--parser-mode <mode>', '指定解析器模式 (basic 或 enhanced)')
  .option('--export-md', '导出为Markdown文档')
  .option('--export-html', '导出为HTML文档')
  .option('--init', '生成默认配置文件');

// 解析命令行参数
program.parse(process.argv);
const options = program.opts();

// 处理初始化命令
if (options.init) {
  const configPath = options.config || './vuelens.config.js';
  generateDefaultConfig(path.resolve(configPath))
    .then(() => {
      process.exit(0);
    })
    .catch(() => {
      process.exit(1);
    });
} else {
  // 尝试加载配置文件
  const configPath = options.config || './vuelens.config.js';
  const config = loadConfig(configPath);

  // 合并配置，命令行选项优先
  const port = parseInt(options.port) || config.port || DEFAULT_PORT;
  const scanPaths = options.scan ? options.scan.split(',') : config.scanPaths || DEFAULT_SCAN_PATHS;
  const outputPath = options.output || config.outputPath || './vuelens-docs';
  const vueVersion = options.vueVersion || config.vueVersion || 'auto';
  const parserMode = options.parserMode 
    ? (options.parserMode === 'basic' ? ParserMode.BASIC : ParserMode.ENHANCED)
    : config.parserMode || ParserMode.ENHANCED;

  console.log(chalk.blue('VueLens') + chalk.green(` v${version}`));
  console.log(chalk.yellow('扫描路径:'), scanPaths.join(', '));
  console.log(chalk.yellow('端口:'), port);
  console.log(chalk.yellow('解析器模式:'), parserMode);

  // 创建解析器实例
  const parser = ParserFactory.createParser(parserMode, scanPaths, vueVersion);

  // 检查是否需要导出而不是启动服务器
  if (options.exportMd) {
    console.log(chalk.cyan('生成Markdown文档...'));
    generateMarkdown(scanPaths, path.resolve(outputPath), vueVersion, parser)
      .then(() => {
        console.log(chalk.green(`Markdown文档已生成到 ${outputPath}`));
      })
      .catch((err: Error) => {
        console.error(chalk.red('生成Markdown文档时出错:'), err);
        process.exit(1);
      });
  } else if (options.exportHtml) {
    console.log(chalk.cyan('生成HTML文档...'));
    generateHtml(scanPaths, path.resolve(outputPath), vueVersion, parser)
      .then(() => {
        console.log(chalk.green(`HTML文档已生成到 ${outputPath}`));
      })
      .catch((err: Error) => {
        console.error(chalk.red('生成HTML文档时出错:'), err);
        process.exit(1);
      });
  } else {
    // 启动服务器
    startServer(scanPaths, port, vueVersion, parser)
      .then(() => {
        console.log(chalk.green(`服务已启动，请访问 http://localhost:${port}`));
      })
      .catch((err: Error) => {
        console.error(chalk.red('启动服务器时出错:'), err);
        process.exit(1);
      });
  }
} 